package com.lft.tree03.array_binary_tree;

/**
 * 顺序存储二叉树
 */
public class ArrayBinaryTreeDemo {
	public static void main(String[] args) {
		int[] a = {1, 2, 3, 4, 5, 6, 7};
		ArrayBinanryTree tree = new ArrayBinanryTree(a);
		tree.preOrder();
		System.out.println();
		tree.infixOrder();
		System.out.println();
		tree.postOrder();
	}
}

/**
 * 实现顺序存储二叉树
 */
class ArrayBinanryTree {
	/**
	 * 存储数据节点的数组。
	 */
	private int[] array;
	
	public ArrayBinanryTree(int[] array) {
		this.array = array;
	}
	
	/**
	 * 重载方法，简洁调用。
	 */
	public void preOrder() {
		this.preOrder(0);
	}
	
	/**
	 * 完成顺序存储二叉树的前序遍历的方法。
	 * @param index 数组的下标。
	 */
	public void preOrder(int index) {
		// 如果数组为空，或者 array.length == 0
		if (array == null || array.length == 0) {
			System.out.println("数组为空，不能按照二叉树的前序遍历");
		}
		// 输出当前这个元素
		System.out.println(array[index]);
		
		// 向左递归遍历
		if (2 * index + 1 < array.length) {
			preOrder(2 * index + 1);
		}
		
		// 向右递归遍历
		if (2 * index + 2 < array.length) {
			preOrder(2 * index + 2);
		}
	}
	
	/**
	 * 重载方法，简洁调用。
	 */
	public void infixOrder() {
		this.infixOrder(0);
	}
	
	/**
	 * 完成顺序存储二叉树的中序遍历的方法。
	 * @param index 数组的下标。
	 */
	public void infixOrder(int index) {
		// 如果数组为空，或者 array.length == 0
		if (array == null || array.length == 0) {
			System.out.println("数组为空，不能按照二叉树的前序遍历");
		}
		// 向左递归遍历
		if (2 * index + 1 < array.length) {
			infixOrder(2 * index + 1);
		}
		// 输出当前这个元素
		System.out.println(array[index]);
		// 向右递归遍历
		if (2 * index + 2 < array.length) {
			infixOrder(2 * index + 2);
		}
	}
	
	/**
	 * 重载方法，简洁调用。
	 */
	public void postOrder() {
		this.postOrder(0);
	}
	
	/**
	 * 完成顺序存储二叉树的后序遍历的方法。
	 * @param index 数组的下标。
	 */
	public void postOrder(int index) {
		// 如果数组为空，或者 array.length == 0
		if (array == null || array.length == 0) {
			System.out.println("数组为空，不能按照二叉树的前序遍历");
		}
		// 向左递归遍历
		if (2 * index + 1 < array.length) {
			postOrder(2 * index + 1);
		}
		// 向右递归遍历
		if (2 * index + 2 < array.length) {
			postOrder(2 * index + 2);
		}
		// 输出当前这个元素
		System.out.println(array[index]);
	}
}
